草庐IT

c++ - C++中static的含义

全部标签

c++ - constexpr、static_assert 和内联

我之前询问过functionoverloadingbasedonwhethertheargumentsareconstexpr.我正在尝试解决该问题的令人失望的答案,以制作更智能的断言功能。这大致就是我想要做的:inlinevoidsmart_assert(boolcondition){if(is_constexpr(condition))static_assert(condition,"Error!!!");elseassert(condition);}基本上,如果可以在编译时进行检查,那么编译时检查总是比运行时检查要好。但是,由于内联和常量折叠之类的原因,我不能总是知道是否可以进行

c++ - typedef void FOO 与 #define FOO void 在函数签名中的含义

这个问题在这里已经有了答案:void,VOID,CandC++(3个回答)关闭7年前。在浏览一些大量混合C和C++的源代码时,我遇到了以下内容(为了保护公司的工作,稍作修改,含义保持不变):/**TypedefsofvoidaresynonymouswiththevoidkeywordinC,*butnotinC++.InordertosupporttheuseofMY_VOID*inplaceofthevoidkeywordtospecifythatafunctiontakesno*arguments,itmustbeamacroratherthanatypedef.*/#defin

c++ - 部分模板特化触发 static_asserts

考虑这段代码templatestructdelay:std::false_type{};templatestructmy_typelist{static_assert(delay{},"");};templatestructtest;templatestructtest>{voidpass(){}};templatevoidfail(consttest&){}intmain(){test>t;t.pass();fail(t);}不调用fail()代码编译并运行良好。但是,在任何函数中使用t似乎都会触发my_typelist类中的static_assert,即使该类从未被实例化。尽管该示

c++ - static_cast<Derived *>(Base pointer) 是否应该给出编译时错误?

static_cast(Basepointer)是否应该给出编译时错误?classA{public:A(){}};classB:publicA{public:B(){}};intmain(){A*a=newA();B*b=static_cast(a);//CompileError?} 最佳答案 它不会给出编译时错误,因为Base-Derived关系可以在运行时存在,具体取决于被强制转换的指针的地址。static_cast总是成功,但如果你不转换为正确的类型,则会引发undefined-behavior。dynamic_cast可能会

c++ - 在 C++ 中将值作为常量、引用和常量引用返回的含义是什么?

我正在学习C++,但我仍然对此感到困惑。在C++中将值作为常量、引用和常量引用返回的含义是什么?例如:constintexampleOne();int&exampleTwo();constint&exampleThree(); 最佳答案 以下是您所有案例的内幕:•按引用返回:函数调用可用作赋值的左侧。例如使用运算符重载,如果你有operator[]重载,你可以说类似a[i]=7;(通过引用返回时需要确保返回的对象在返回后可用:不应该返回对本地或临时的引用)•作为常量值返回:防止函数在赋值表达式的左侧使用。考虑重载的operator+

c++ - 强制 C++ 函数的用户承认作为数值常量的参数的语义含义的最佳方法是什么?

我想编写函数接口(interface),强制用户承认内置常量的语义。比如我想拿voidrotate(floatangle);//Rotatetheworldbyanangleinradians.并将其更改为voidrotate(Radiansangle);我是否认为创建Radians类的问题在于它添加了代码并使程序变慢。有没有更好的方法来做到这一点? 最佳答案 不,可以将大多数体面的编译器应该优化的Radians类制作成不比普通float慢的东西。您可能对boost.units感兴趣.事实上,使用boost.units你甚至可以设置

c++ - C++ 规范是否说明了如何在 static_cast/const_cast 链中选择类型以用于 C 样式转换?

这个问题涉及我在尝试回答thisearlier,intriguingquestionaboutC-stylecastsandtypeconversions时在C++规范中注意到的内容。.C++规范在§5.4中讨论了C风格的强制转换。它表示强制转换符号将按此顺序尝试以下强制转换,直到找到一个有效的强制转换:const_caststatic_caststatic_cast紧随其后的是const_castreinterpret_castreinterpret_cast紧随其后的是const_cast.虽然我对使用static_cast的含义有一个非常直观的想法。后跟const_cast(例如

c++ - static_cast 被滥用了吗?

我对static_cast的感受很复杂,因为它是可用的最安全的C++强制转换,但同时允许安全和不安全转换,所以你必须知道上下文来说明它是否真的安全或可能导致UB(例如,当强制转换为子类时)。那么为什么没有更安全的显式转换呢?这是一个示例,它可能有用。在COM中,它们必须将接口(interface)指针返回为void**ppv,所以“必须”明确地转换*ppv=(IInterface*)this;后来建议用更安全的C++强制转换*ppv=static_cast(this);但是,即使是static_cast也有意义吗?这里?this是派生自IInterface的类,所以可以简单地写IInt

c++ - C/C++ static const 局部变量的用途

很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visitthehelpcenter.关闭9年前。在C和C++中,将本地const变量设为static有什么好处?假设初始化不使用其他变量,在调用之间保留值和每次调用设置相同的常量值之间有什么区别吗?一个有效的C编译器可以忽略static吗?在C++中,它避免了调用之间的构造/破坏,但还有其他好处吗? 最佳答案 如果你有类似的东西,它不占用堆栈空间可能是一个好处:staticco

c++ - 有没有办法 "statically"将共享的 .so(或 .o)库插入可执行文件?

首先,考虑以下情况。下面是一个程序://test.cppextern"C"voidprintf(constchar*,...);intmain(){printf("Hello");}下面是一个库://ext.cpp(theexternallibrary)#includeextern"C"voidprintf(constchar*p,...);voidprintf(constchar*p,...){std::cout现在我可以用两种不同的方式编译上面的程序和库了。第一种方式是编译程序不链接外部库:$g++test.cpp-otest$lddtestlinux-gate.so.1=>(0x